#include "udplib.h"

//signal
#include <signal.h>

/*--- Shared Memory key ---*/
#define SHM_PERM 0777
#define SHM_KEY getpid()

/*--- Semaphore key ---*/
// key ist der Pid
/// 4 semaphoren werden benutzt
//der erste schuetzt der Zugrifft auf der SharedMemory
//der zweite kontrolliert die Anzahl von freie Plaetze im Puffer
//Mit dem dritten, warte der Vater Prozess der sendende Host auf seinem Kind Prozess
//Mit dem vierten, warte der Kind Prozess der empfangende Host auf seinem Vater prozess
#define SEM_KEY getpid()
#define SEM_NUM 4
#define SEM_PERM 0777

#define SEM_MUTEX 0

/*--- Groesse des Buffer und Groesse eines Paket ---*/
#define BUFFER_SIZE  8
#define PAKET_SIZE   4000

///Macros
///------
// Nachrichten
#define CON_REQ 	"CON_REQ"
#define CON_CLOSE 	"CON_CLOSE"

#define CON_ACK 	"CON_ACK"
#define CON_DATA_ACK 	"CON_DATA_ACK"
#define CON_CLOSE_ACK 	"CON_CLOSE_ACK"
#define CON_REJECT 	"CON_REJECT"

// Type von Host
#define SENDER 		1
#define RECEIVER	2

// Zustand eine Verbindung
#define ACCEPT		1
#define REJECT_REQ	2
#define REJECT_ACK	3
#define STOP		4

/** Erweiterung des SharedMemory **/
typedef struct 
{
 char inPuffer[BUFFER_SIZE][PAKET_SIZE]; // Puffer fuer empfangenen Daten
 char ouPuffer[BUFFER_SIZE][PAKET_SIZE]; // Puffer fuer gesendeten Daten

 int  inRdx, inWdx; // Read und Write Index des Inpuffer
 int  ouRdx, ouWdx; // Read und Write Index des Oupuffer

 int reject;	    // kommunikation wird angenommen oder nein
 int type  ; 	    // type des Host:1 sender or 2 receiver
 int reponses;      // Anzahl der Paketen ohne Antworten
 int stop;	    // wenn stop = STOP, dann musst der aktuell Verbindungen gestopt 
		    //werden

} SharedMem;

int sockN;

/** SignalHandler **/
void signalhandler(int sig)
{
    printf("Signal %d caught.\n", sig);

    if(0 > close(sockN))
    {
	perror("Problem with close().");
	exit(1);
    }
    
    exit(0);
};



